package com.ch.engine.daily.abstractTest;

import java.util.Arrays;
import java.util.List;

/**
 * 支付系统演示 - 展示抽象类和接口的区别与用法
 *
 * @author wangchunhui
 * @date 2025/1/25
 */
public class PaymentDemo {
    
    public static void main(String[] args) {
        System.out.println("=== 抽象类与接口对比演示 ===\n");
        
        // 1. 演示抽象类的使用（模板方法模式）
        demonstrateAbstractClass();
        
        // 2. 演示接口的使用（多态性）
        demonstrateInterface();
        
        // 3. 演示工厂模式
        demonstrateFactoryPattern();
        
        // 4. 演示接口的静态方法和默认方法
        demonstrateInterfaceFeatures();
        
        // 5. 总结对比
        printComparison();
    }
    
    private static void demonstrateAbstractClass() {
        System.out.println("【1. 抽象类演示 - 模板方法模式】");
        System.out.println("抽象类特点：有构造方法、成员变量、具体方法和抽象方法");
        
        AbstractPaymentProcessor aliPay = new AliPay();
        AbstractPaymentProcessor wechatPay = new WeChatPay();
        
        // 使用模板方法，流程固定，具体实现由子类决定
        aliPay.executePayment(100.0);
        wechatPay.executePayment(200.0);
    }
    
    private static void demonstrateInterface() {
        System.out.println("【2. 接口演示 - 多态性和多重继承】");
        System.out.println("接口特点：只有抽象方法、常量、默认方法和静态方法");
        
        // 多态：同一接口的不同实现
        List<PaymentInterface> payments = Arrays.asList(
            new AliPay(),
            new WeChatPay(),
            new CreditCardPay("1234567890123456", "招商银行")
        );
        
        for (PaymentInterface payment : payments) {
            payment.processPayment(150.0);
        }
    }
    
    private static void demonstrateFactoryPattern() {
        System.out.println("【3. 工厂模式演示】");
        
        // 使用工厂创建支付对象
        PaymentInterface payment1 = PaymentFactory.createPayment(
            PaymentFactory.PaymentType.CREDIT_CARD, "9876543210987654", "中国银行");
        payment1.processPayment(300.0);
        
        AbstractPaymentProcessor payment2 = PaymentFactory.createAbstractPayment(
            PaymentFactory.PaymentType.ALIPAY);
        payment2.executePayment(250.0);
    }
    
    private static void demonstrateInterfaceFeatures() {
        System.out.println("【4. 接口新特性演示（Java 8+）】");
        
        // 静态方法调用
        System.out.println("格式化金额：" + PaymentInterface.formatAmount(999.99));
        System.out.println("最小支付金额：" + PaymentInterface.MIN_AMOUNT);
        System.out.println("货币类型：" + PaymentInterface.CURRENCY);
        
        // 默认方法使用
        PaymentInterface payment = new AliPay();
        try {
            payment.validateAmount(-10); // 会抛出异常
        } catch (IllegalArgumentException e) {
            System.out.println("验证失败：" + e.getMessage());
        }
    }
    
    private static void printComparison() {
        System.out.println("\n【5. 抽象类 vs 接口 对比总结】");
        System.out.println("┌─────────────────┬─────────────────┬─────────────────┐");
        System.out.println("│      特性       │     抽象类      │      接口       │");
        System.out.println("├─────────────────┼─────────────────┼─────────────────┤");
        System.out.println("│   继承关系      │    单继承       │    多重实现     │");
        System.out.println("│   构造方法      │     可以有      │     不能有      │");
        System.out.println("│   成员变量      │     可以有      │  只能有常量     │");
        System.out.println("│   方法实现      │  可以有具体方法 │ 抽象+默认+静态  │");
        System.out.println("│   访问修饰符    │     任意        │   public        │");
        System.out.println("│   使用场景      │   模板方法模式  │   规范定义      │");
        System.out.println("│   设计理念      │    is-a关系     │   can-do能力    │");
        System.out.println("└─────────────────┴─────────────────┴─────────────────┘");
        
        System.out.println("\n【设计模式应用】");
        System.out.println("• 模板方法模式：抽象类定义算法骨架，子类实现具体步骤");
        System.out.println("• 策略模式：接口定义策略，不同实现类提供不同策略");
        System.out.println("• 工厂模式：创建对象时返回接口类型，实现解耦");
        System.out.println("• 适配器模式：通过接口适配不同的实现");
    }
}